angular.module('eYe')	
	.factory('DataBase', function ($rootScope, $route, PATH, Popup) {
		var DataBase = {
			BD_Themes_Qcms: '',
			BD_Donnees_Utilisateur: '',
			statut: 0
		};

		DataBase.init = function(callback){
		
			if (DataBase.statut == 0){
		
				$data.EntityContext.extend('BD_Themes_Qcms', {
					Themes: { type: $data.EntitySet, elementType: Theme },
					Qcms: { type: $data.EntitySet, elementType: Qcm },
					Questions: { type: $data.EntitySet, elementType: Question },
					Reponses: { type: $data.EntitySet, elementType: Reponse },
					Niveaux: { type: $data.EntitySet, elementType: Niveau },
					Difficultes: { type: $data.EntitySet, elementType: Difficulte },
					Evaluations: { type: $data.EntitySet, elementType: Evaluation }
				});

				$data.EntityContext.extend('BD_Donnees_Utilisateur', {
					Utilisateurs: { type: $data.EntitySet, elementType: Utilisateur },
					Statistiques: { type: $data.EntitySet, elementType: Statistique },
					Contacts: { type: $data.EntitySet, elementType: Contact }
				});				

				DataBase.BD_Donnees_Utilisateur = new BD_Donnees_Utilisateur({ provider: ['indexedDb','webSql'], databaseName:'eye_donnees_utilisateur', version:1}); 

				DataBase.BD_Donnees_Utilisateur.onReady(function() {		
						
					if(Offline.state == 'up'){

						/* Ajout des données */
						$('#message_chargement').text('Récupérations des Thèmes et des QCM');
						$('#message_chargement').css('left',(($('#cache_chargement').width()/2)-($('#message_chargement').width()/2))+'px');
 						$('#message_chargement').css('top',((($('#cache_chargement').height()/2)-($('#message_chargement').height()/2))+30)+'px');	

						$.ajax({
							url:PATH.back+'donnees',
							type:'POST',
							dataType:'json',
							async:false,
							success:function(data){

								if(data != ''){

									DataBase.BD_Themes_Qcms = new BD_Themes_Qcms({ provider: ['indexedDb','webSql'], databaseName:'eye_themes_qcms', dbCreation: $data.storageProviders.DbCreationType.DropAllExistingTables, version:1 });

									DataBase.BD_Themes_Qcms.onReady(function() {	

										DataBase.BD_Themes_Qcms.Themes.add(new Theme({id:0,titre:'Themes'}));
											
										DataBase.BD_Themes_Qcms.Themes.addMany(data.tabThemes);

										DataBase.BD_Themes_Qcms.Qcms.addMany(data.tabQcms);

										DataBase.BD_Themes_Qcms.Questions.addMany(data.tabQuestions);

										DataBase.BD_Themes_Qcms.Reponses.addMany(data.tabReponses);

										DataBase.BD_Themes_Qcms.Niveaux.addMany(data.tabNiveaux);

										DataBase.BD_Themes_Qcms.Difficultes.addMany(data.tabDifficultes);
										
										DataBase.BD_Themes_Qcms.Evaluations.addMany(data.tabEvaluations);

										DataBase.statut = 1;
										
										$.when(DataBase.BD_Themes_Qcms.saveChanges()).then(function(){
											return $.when(DataBase.envoyerDemandeContact(false)).then(function(){
												var callbacks = $.Callbacks();
												callbacks.add(callback);					
												callbacks.fire();
											});
										});
									});
								}
							},
							error:function(){
								DataBase.BD_Themes_Qcms = new BD_Themes_Qcms({ provider: ['indexedDb','webSql'], databaseName:'eye_themes_qcms', version:1});
								DataBase.BD_Themes_Qcms.onReady(function() {
									DataBase.statut = 1;
									var callbacks = $.Callbacks();
									callbacks.add(callback);					
									callbacks.fire();
								});
							}
						});

					}
					else{
						DataBase.BD_Themes_Qcms = new BD_Themes_Qcms({ provider: ['indexedDb','webSql'], databaseName:'eye_themes_qcms', version:1});
						DataBase.BD_Themes_Qcms.onReady(function() {
							DataBase.statut = 1;
							var callbacks = $.Callbacks();
							callbacks.add(callback);					
							callbacks.fire();
						})
					}	
							
				});
			}
			else{
				var callbacks = $.Callbacks();
				callbacks.add(callback);					
				callbacks.fire();
			}
		};

		DataBase.synchronisationStats = function (){	
			/* Envoie des Statistiques */
			if(Offline.state == 'up'){

				$('#message_chargement').text('Synchronisation des Statistiques');
				$('#message_chargement').css('left',(($('#cache_chargement').width()/2)-($('#message_chargement').width()/2))+'px');
 				$('#message_chargement').css('top',((($('#cache_chargement').height()/2)-($('#message_chargement').height()/2))+30)+'px');
 				
				$.when(
					getStatistiquesNonSynchroByUser(DataBase.BD_Donnees_Utilisateur,utilisateurActuel.id)
				).then(function(tabStats){						
					$.ajax({
						url:PATH.back+'statistiques',
						type:'POST',
						dataType:'json',
						data:{statistiques:JSON.stringify(tabStats),id_user:utilisateurActuel.id},
						async:false,
						success:function(data){
							
							if(data.length > 0){
								$.when(
									DataBase.BD_Donnees_Utilisateur.Statistiques.toArray().then(function(items){  
										 items.forEach( function(row) {				
											DataBase.BD_Donnees_Utilisateur.Statistiques.remove(row);	
										});
										return DataBase.BD_Donnees_Utilisateur.saveChanges();
									})
								).then(function(){
									DataBase.BD_Donnees_Utilisateur.Statistiques.addMany(data);									
									return DataBase.BD_Donnees_Utilisateur.saveChanges();
								});
							}
							
						}
					});
				});
			}
		};

		DataBase.envoyerDemandeContact = function(direct){
			if(Offline.state == 'up'){
				
				$('#message_chargement').text('Envoie des demandes de contact');
				if(direct){
					$('#cache_chargement').show();
				}
				$('#message_chargement').css('left',(($('#cache_chargement').width()/2)-($('#message_chargement').width()/2))+'px');
 				$('#message_chargement').css('top',((($('#cache_chargement').height()/2)-($('#message_chargement').height()/2))+30)+'px');

				$.when(
					DataBase.BD_Donnees_Utilisateur.Contacts.toArray()
				).then(function(tabContacts){	

					if(tabContacts.length > 0){

						$.ajax({
							url:PATH.back+'contact',
							type:'POST',
							dataType:'json',
							data:{tabContacts:JSON.stringify(tabContacts)},
							async:false,
							success:function(data){	
								return $.when(	
									DataBase.BD_Donnees_Utilisateur.Contacts.toArray().then(function(items){  
										items.forEach( function(row) {				
											DataBase.BD_Donnees_Utilisateur.Contacts.remove(row);	
										});
										return DataBase.BD_Donnees_Utilisateur.saveChanges();
									})
								).then(function(){
									if(data.length > 0){
										DataBase.addValueTable(DataBase.BD_Donnees_Utilisateur,DataBase.BD_Donnees_Utilisateur.Contacts,data,true);
										DataBase.BD_Donnees_Utilisateur.Contacts.addMany(data);
									}

									if(direct){										
										var config = {
											typePopup:'autre',
											message:'Votre demande a été prise en compte',
											fonctionReponse:null,
											btn_fermer:true,
											btn_oui_non:false};
										Popup.afficherPopup(config);
										$route.reload();
									}
								});														
							},
							error:function(){
								if(direct){									
									var config = {
										typePopup:'autre',
										message:'Votre demande a été enregistré',
										fonctionReponse:null,
										btn_fermer:true,
										btn_oui_non:false};
									Popup.afficherPopup(config);
									$route.reload();
								}
							}
						});
					}
				});
			}	
		}

		DataBase.getValueTable = function (BD,table,champs,valeur){		

			if(typeof valeur === 'string'){
				valeur = '"'+valeur+'"';
			}	
						
			var nomTable = table.tableName;
		
			return $.when(eval("getValue" + nomTable + "(BD,champs,valeur)")).then(function(resultat){
				return resultat;
			});
																	
		}

		DataBase.setValueTable = function (BD,table,id,champs,valeur){

			var row = table.attachOrGet({ id:id});			
			row[champs] = valeur;
			return BD.saveChanges();
			
		}

		DataBase.addValueTable = function (BD,table,valeur,tableau){

			if(tableau){
				table.addMany(valeur);
			}
			else{
				table.add(valeur);
			}

			return BD.saveChanges();

		}

		return DataBase;
	});